﻿using Model;
using Model.Auxiliar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class Cargo_BLL
    {
        #region singleton
        private static Cargo_BLL instance;

        private Cargo_BLL() { }

        public static Cargo_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Cargo_BLL();
                }
                return instance;
            }
        }
        #endregion

        public int criarCargo(int id_cliente, string userid, string ip,
                                      int id_empresa, string cargo, string obs, int id_departamento)
        {
            int result = 0;
            try
            {
                hrpEntities hrp = new hrpEntities();
                hrp_cargos novoCargo = new hrp_cargos();

                novoCargo.id_cliente = id_cliente;
                novoCargo.user_id = userid;
                novoCargo.user_timestamp = DateTime.Now;
                novoCargo.user_ip = ip;
                novoCargo.id_empresa = id_empresa;
                novoCargo.cargo = cargo;
                novoCargo.activo = true;
                novoCargo.observacao = obs;
                novoCargo.data_criacao = DateTime.Now;
                novoCargo.id_departamento = id_departamento;

                hrp.hrp_cargos.Add(novoCargo);
                hrp.SaveChanges();
                result = novoCargo.id;


            }
            catch (Exception)
            {
                throw;
            }


            return result;
        }

        public bool verificarCargoExiste(string nomeCargo, int idempresa)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_cargos.Any(c => c.id_empresa == idempresa && c.cargo == nomeCargo);
        }

        public hrp_cargos ObterCargo(int id_cliente, int id_empresa, int cargo_id)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_cargos.FirstOrDefault(d => d.id_cliente == id_cliente && d.id_empresa == id_empresa && d.id == cargo_id);
        }

        public List<hrp_cargos> obterCargosPorDepartamentoDeEmpresa(int id_empresa, int id_departamento)
        {
            hrpEntities hrp = new hrpEntities();
            var list = hrp.hrp_cargos.Where(e => e.id_empresa == id_empresa && e.activo == true && e.id_departamento == id_departamento);
            return list.ToList();
        }

        public List<Cargo> obterCargosDepartamento(int id_empresa, int id_departamento, bool apenasActivos)
        {
            hrpEntities hrp = new hrpEntities();
            var departamentoCargo = from departamento in hrp.hrp_departamentos
                                    join cargo in hrp.hrp_cargos on departamento.id equals cargo.id_departamento into cargoDepView
                                    from cargoDep in cargoDepView
                                    where departamento.id_empresa == id_empresa 
                                    && (id_departamento==0 || (id_departamento!=0 && departamento.id == id_departamento))
                                    && (!apenasActivos || (apenasActivos && cargoDep.activo.Value==apenasActivos))
                                    select new Cargo
                                    {
                                        Nome = cargoDep.cargo,
                                        Departamento = departamento.departamento,
                                        DepartamentoId = departamento.id,
                                        Id = cargoDep.id,
                                        Observacao = cargoDep.observacao,
                                        DataCriacao = cargoDep.data_criacao,
                                        Activo = cargoDep.activo.Value
                                    };
            return departamentoCargo.ToList();
        }

         private void CriarLog(hrpEntities hrp, ref hrp_cargos cargo, string userId, string userIp, DateTime userTimestamp)
        {
            hrp_cargos_log cargoLog = new hrp_cargos_log();
            cargoLog.cargo = cargo.cargo;
            cargoLog.activo = cargo.activo;
            cargoLog.data_criacao = cargo.data_criacao;
            cargoLog.id_departamento = cargo.id_departamento;
            cargoLog.id = cargo.id;
            cargoLog.id_cliente = cargo.id_cliente;
            cargoLog.id_empresa = cargo.id_empresa;
            cargoLog.log_user_id = userId;
            cargoLog.log_user_ip = userIp;
            cargoLog.log_user_timestamp = userTimestamp;
            cargoLog.observacao = cargo.observacao;
            cargoLog.user_id = cargo.user_id;
            cargoLog.user_ip = cargo.user_ip;
            cargoLog.user_timestamp = cargo.user_timestamp;
            hrp.hrp_cargos_log.Add(cargoLog);
        }

        public void ActualizarCargo(int id_cliente, string userid, int id, string nome, string obs, int depId)
        {
            DateTime timestamp = DateTime.Now;
            hrpEntities hrp = new hrpEntities();
            hrp_cargos cargo = hrp.hrp_cargos.FirstOrDefault(d => d.id == id);
            CriarLog(hrp,ref cargo,userid,"",timestamp);

            cargo.id_cliente = id_cliente;
            cargo.id_departamento = depId;
            cargo.user_id = userid;
            cargo.cargo = nome;
            cargo.observacao = obs;
            cargo.user_timestamp = timestamp;
            hrp.SaveChanges();
        }

        public void AlterarEstado(int id_cliente, string userid, int id)
        {
            DateTime timestamp = DateTime.Now;
            hrpEntities hrp = new hrpEntities();
            hrp_cargos cargo = hrp.hrp_cargos.FirstOrDefault(d => d.id == id);
            CriarLog(hrp, ref cargo, userid, "", timestamp);
            cargo.activo = !cargo.activo;
            cargo.user_id = userid;
            cargo.user_timestamp = timestamp;
            hrp.SaveChanges();
        }
    }
}
